/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Negocio;

import Conexion.Conexion;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author equipo_4
 */
public class Escribir 
{
    public static void escribirClases(String nombreTabla)
    {
        FileWriter fichero = null;
        PrintWriter pw = null;
        try
        {
            Conexion con = new Conexion("broker", "oracle123");
            fichero = new FileWriter("d:/Modelo/"+nombreTabla+".java");
            pw = new PrintWriter(fichero);
            
            ResultSet campos = DataBase.Campostabla(nombreTabla, con);
            List<capos_tabla> lista = new ArrayList<>();
            
            while(campos.next())
            {
                capos_tabla c = new capos_tabla(campos.getString("COLUMN_NAME"), campos.getString("DATA_TYPE"));
                lista.add(c);
            }
            con.Close();
            
            pw.println(Cimport());
            pw.println("\n");
            pw.println(Cinit(nombreTabla));
            pw.println("\n");
            pw.println(cinisializar(nombreTabla,lista));
            pw.println("\n");
            pw.println(CConstructorVacio(nombreTabla));
            pw.println("\n");
            pw.println(CConstructorLleno(nombreTabla,lista));
            pw.println("\n");
            pw.println(CInsertar(nombreTabla,lista));
            pw.println("\n");
            pw.println(CEliminar(nombreTabla,lista));
            pw.println("\n");
            pw.println(CTodos(nombreTabla));
            pw.println("\n");
            pw.println(CCargar(nombreTabla,lista));
            pw.println("\n");
            pw.println(CGetYSet(nombreTabla,lista));
            pw.println("\n");
            pw.println("}");
            con.Close();
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        finally 
        {
           try 
           {
           // Nuevamente aprovechamos el finally para 
           // asegurarnos que se cierra el fichero.
           if (null != fichero)
              fichero.close();
           } 
           catch (Exception e2) 
           {
              e2.printStackTrace();
           }
        }
    }
    
    
    
    
    private static String CInsertar(String nombre_clase, List<capos_tabla> lista) throws SQLException
    {
        String ccampos = "public boolean Insertar() {\n";
        ccampos += "try {\n";
        
        ccampos += "String consulta = \"insert into BROKER."+nombre_clase+"(";
        
        for(int i =0; i<lista.size(); i++)
        {
            
                ccampos+=lista.get(i).getNombre();
            if(i!=lista.size()-1)
                ccampos += ", ";
        }
        
        ccampos+=") VALUES (";
        
        for(int i =0; i<lista.size(); i++)
        {
             if(lista.get(i).getTipo().equals("NUMBER"))
            {
                ccampos += "\"+"+lista.get(i).getNombre()+"+\"";
            }
            if(lista.get(i).getTipo().equals("VARCHAR2"))
            {
                ccampos += "'\"+"+lista.get(i).getNombre()+"+\"'";
            }
            if(lista.get(i).getTipo().equals("FLOAT"))
            {
                ccampos += "\"+"+lista.get(i).getNombre()+"+\"";
            }
            if(lista.get(i).getTipo().equals("DATE"))
            {
                ccampos += "'\"+"+lista.get(i).getNombre()+"+\"'";
            }
            if(i!=lista.size()-1)
            ccampos+=",";
        }                
        
        ccampos+=")\";\n";
        
        ccampos += "con.EjecutarSentencia(consulta);\n";
        ccampos += "return true;\n";
        ccampos += "} catch (Exception e) {\n";
        ccampos += "e.printStackTrace();\n";
        ccampos += "return false;\n";
        ccampos += "}\n";
        ccampos += "}";
        return ccampos;
    }
    private static String CGetYSet(String nombre_clase, List<capos_tabla> lista) throws SQLException
    {        
        String ccampos = "";
        
        for(int i =0; i<lista.size(); i++)
        {
            String tipo = lista.get(i).getTipo();
            String nombre = lista.get(i).getNombre();
            
            if(tipo.equals("NUMBER"))
            {
                ccampos += "public double get"+nombre+"(){\nreturn "+nombre+";\n}\n";
                ccampos += "public void set"+nombre+"(double "+nombre+"){\n this."+nombre+" = "+nombre+";\n}\n";
            }
            if(tipo.equals("VARCHAR2"))
            {
                ccampos += "public String get"+nombre+"(){\nreturn "+nombre+";\n}\n";
                ccampos += "public void set"+nombre+"(String "+nombre+"){\n this."+nombre+" = "+nombre+";\n}\n";
            }
            if(tipo.equals("FLOAT"))
            {
                ccampos += "public double get"+nombre+"(){\nreturn "+nombre+";\n}\n";
                ccampos += "public void set"+nombre+"(Double "+nombre+"){\n this."+nombre+" = "+nombre+";\n}\n";
            }
            if(tipo.equals("DATE"))
            {
                ccampos += "public double get"+nombre+"(){\nSimpleDateFormat sdf = new SimpleDateFormat(\"dd/MMMM/yyyy hh:mm:ss\");\nreturn sdf.format("+nombre+");\n}\n";
                ccampos += "public void set"+nombre+"(Date "+nombre+"){\n this."+nombre+" = "+nombre+";\n}\n";
            }
        }
        
        ccampos += "public Conexion getCon(){\nreturn this.con;\n}\n";
        ccampos += "public void setCon(Conexion con){\n this.con=con;\n}\n";        
        return ccampos;
    }
    private static String CEliminar(String nombre_clase, List<capos_tabla> lista) throws SQLException
    {    
        String ccampos = "public boolean EliminarXid() {\n";
        ccampos += "try {\n";
        
        ccampos += "String consulta = \"delete from BROKER."+nombre_clase+" where ID= \"+getID();\n";
        ccampos += "con.EjecutarSentencia(consulta);\n";
        ccampos += "return true;\n";
        ccampos += "} catch (Exception e) {\n";
        ccampos += "e.printStackTrace();\n";
        ccampos += "return false;\n";
        ccampos += "}\n";
        ccampos += "}";
        return ccampos;
    }
    
     private static String CTodos(String nombre_clase) throws SQLException
    {
        
        String ccampos = "public List<"+nombre_clase+"> Todos() {\n";
        ccampos += "try {\n";
        
        ccampos += "String consulta = \"select * from BROKER."+nombre_clase+"\";\n";
        ccampos += "ResultSet rs=con.EjecutarConsulta(consulta);\n";
        ccampos += "return Cargar(rs);\n";
        ccampos += "} catch (Exception e) {\n";
        ccampos += "e.printStackTrace();\n";
        ccampos += "return null;\n";
        ccampos += "}\n";
        ccampos += "}";
        return ccampos;
    }
     
     private static String CCargar(String nombre_clase, List<capos_tabla> lista) throws SQLException
    {
        String ccampos = "public List<"+nombre_clase+"> Cargar(ResultSet rs) {\n";
        ccampos += "try {\n";        
        ccampos += "List<"+nombre_clase+"> lista = new ArrayList<"+nombre_clase+">();";
        ccampos += "while (rs.next()) {";
        ccampos += ""+nombre_clase+" objeto = new "+nombre_clase+"();";
        
        
        
        for(int i =0; i<lista.size(); i++)
        {
             if(lista.get(i).getTipo().equals("NUMBER"))
            {
                ccampos += "objeto.set"+lista.get(i).getNombre()+"(rs.getDouble(\""+lista.get(i).getNombre()+"\"));";
            }
            if(lista.get(i).getTipo().equals("VARCHAR2"))
            {
                ccampos += "objeto.set"+lista.get(i).getNombre()+"(rs.getString(\""+lista.get(i).getNombre()+"\"));";
            }
            if(lista.get(i).getTipo().equals("FLOAT"))
            {
                ccampos += "objeto.set"+lista.get(i).getNombre()+"(rs.getDouble(\""+lista.get(i).getNombre()+"\"));";
            }
            if(lista.get(i).getTipo().equals("DATE"))
            {
                ccampos += "objeto.set"+lista.get(i).getNombre()+"(rs.getDate(\""+lista.get(i).getNombre()+"\"));";
            }
        }                
        
        ccampos+="objeto.setCon(con);";
        ccampos+="lista.add(objeto);\n}\n";
        ccampos+="return lista;\n}\n";
        ccampos+="catch(SQLException ex){\nex.printStackTrace();\nreturn null;}\n}";
        return ccampos;
    }
     
     
   
    
    private static String Cimport()
    {
        return "package cambiar;\n\nimport Conexion.Conexion;\nimport java.sql.SQLException;\nimport java.sql.ResultSet;\nimport java.util.ArrayList;\nimport java.util.List;\n\n";
    }
    
    private static String Cinit(String nombreClase)
    {
        return "public class "+nombreClase+" {\n";
    }
    
    private static String CConstructorVacio(String nombreClase)
    {
        return "public "+nombreClase+"() {\n\n}\n";
    }
    
    private static String CConstructorLleno(String nombre_clase, List<capos_tabla> lista) throws SQLException
    {
        
        String ccampos ="public "+nombre_clase+"( ";
        
        for(int i =0; i<lista.size(); i++)
        {
            if(lista.get(i).getTipo().equals("NUMBER"))
            {
                ccampos += "Double ";
            }
            if(lista.get(i).getTipo().equals("VARCHAR2"))
            {
                ccampos += "String ";
            }
            if(lista.get(i).getTipo().equals("FLOAT"))
            {
                ccampos += "Double ";
            }
            if(lista.get(i).getTipo().equals("DATE"))
            {
                ccampos += "Date ";
            }
            ccampos += lista.get(i).getNombre();
            
            if(i!=lista.size()-1)
                ccampos += ", ";
            
            
        }
        ccampos += ")\n{\n";
        
        ccampos+=CConstructorLlenoCampos(nombre_clase, lista);
        
        ccampos+="}\n";
        return ccampos;
    }
    private static String CConstructorLlenoCampos(String nombre_clase, List<capos_tabla> lista) throws SQLException
    {
        
        String ccampos ="";
        
        for(int i =0; i<lista.size(); i++)
        {
            ccampos += "this."+lista.get(i).getNombre()+" = "+lista.get(i).getNombre()+";\n";   
        }
        return ccampos;
    }
    
    
    
    private static String cinisializar(String nombre_clase, List<capos_tabla> lista) throws SQLException
    {
        
        String ccampos ="";
        for(int i =0; i<lista.size(); i++)
        {
            if(lista.get(i).getTipo().equals("NUMBER"))
            {
                ccampos += "private Double ";
            }
            if(lista.get(i).getTipo().equals("VARCHAR2"))
            {
                ccampos += "private String ";
            }
            if(lista.get(i).getTipo().equals("FLOAT"))
            {
                ccampos += "private Double ";
            }
            if(lista.get(i).getTipo().equals("DATE"))
            {
                ccampos += "private Date ";
            }
                         
            ccampos += lista.get(i).getNombre()+";\n";            
        }
        ccampos += "private Conexion con = null;\n";
        return ccampos;
    }
    
    
    public static void main(String args[]) throws SQLException
    {
        Conexion con = new Conexion("broker", "oracle123");
        List<String> tablas = DataBase.tablas(con);
        
        for(int i =0; i<tablas.size();i++)
        {            
            Escribir.escribirClases(tablas.get(i));
        }   
        con.Close();
    }
}
